#include "Children.h"
#include "Choice.h"
#include "Sequence.h"
#include <iostream>

/*Constructeur*/
Children::Children( CARDINALITY card ) : ContentParticules( card )
{
}

Children::Children( CARDINALITY card, list<ContentParticules*>& CPList) : ContentParticules( card )
{
	particules = list<ContentParticules*>(CPList);
}

/*Destructeur*/
Children::~Children()
{
	std::list<ContentParticules*>::iterator it = particules.begin();
	while( it != particules.end() )
	{
		delete (*it);
	}
}

void Children::addParticule( ContentParticules* cp )
{
	particules.push_back( cp );
}

void Children::addParticuleFront( ContentParticules* cp )
{
	particules.push_front( cp );
}

void Children::printMe()
{
	std::list<ContentParticules*>::iterator p = particules.begin();
	while(p != particules.end())
	{
		(*p)->printMe();
		p++;
	}	
	std::cout << getCardinalityString();
}

const std::list<ContentParticules*>& Children::getParticuleList() const
{
	return particules;
}

/**
* Retourne le regexp correspondant à l'enfant
* \param delim Le délimiteur, utile pour déterminer si l'on a un choix ou une séquence
*/
string Children::toRegExp( char delim )
{
	std::string regexp;

        /* On parcourt les particules filles à qui on demande leur regexp */
        std::string cpRegExp;
	std::string beginning;

        std::list<ContentParticules*>::iterator it = particules.begin();
	while( it != particules.end() )
        {
                cpRegExp = (*it)->toRegExp();

		/*Choice* choice = dynamic_cast<Choice*> (*it);
		if( choice != NULL )
			delim = '|';
		else
		{
			Sequence* seq = dynamic_cast<Sequence*> (*it);
			if( seq != NULL )
				delim = ',';
		}*/

		beginning = "(";
		if( it != particules.begin() )
			beginning += delim;

                /* On vérifie la cardinalité du CP */
                switch( (*it)->getCardinality() )
                {
                        /* Cas le plus simple */
                        case ONLY_ONE:
                                regexp += cpRegExp;
                                break;
                        /* On a zéro ou x fois le motif */
                        case ZERO_OR_MORE:
                                regexp += beginning + cpRegExp + "(" + delim + ")?)*";
                                break;
                        /* On a 1+ fois le motif */
                        case ONE_OR_MORE:
                                regexp += "(" + cpRegExp + "(" + delim + "(" + cpRegExp + ")" + ")*){1}";
                                break;
                        /* On a 0 ou 1 fois le motif */
                        case OPTIONNAL:
                                regexp += beginning + cpRegExp + ")?";
                                break;
                }

		it++;

		if( it != particules.end() )
			regexp += delim;
        }

        return regexp;
}
